package operate

import (
	"encoding/json"

	"github.com/micro-plat/hydra"
)

//Create 新增操作日志数据(提供给后台系统使用)
//logModule 数据模块, content 日志内容
//*isContainBody是否包含body, 默认为true, false时就不会记录request body数据
func Create(ctx hydra.IContext, userID int64, userName, logModule, content string, opts ...Option) error {
	return createLog(ctx, constructReqData(ctx, userName, userID, logModule, content, opts...))
}

//CreateByUserName 新增操作日志数据(提供给非后台系统使用)
//logModule 数据模块, content 日志内容
//userName 用户名称
func CreateByUserName(ctx hydra.IContext, userName, logModule, content string, opts ...Option) error {
	return createLog(ctx, constructReqData(ctx, userName, 0, logModule, content, opts...))
}

//constructReqData 构造用户操作日志数据
func constructReqData(ctx hydra.IContext, userName string, userID int64, logModule, content string, opts ...Option) *OperateInfo {
	args := make(map[string]string)
	for _, opt := range opts {
		opt(args)
	}

	_, flag := args["not_contain_body"]
	userIP := ctx.User().GetClientIP()
	var body string
	if !flag {
		bodyMap := ctx.Request().GetMap()
		if len(bodyMap) > 0 {
			byteContent, err := json.Marshal(bodyMap)
			if err == nil {
				body = string(byteContent)
			}
		}
	}

	if len(body) > 1024 {
		body = body[:1024]
	}

	if len(content) > 1024 {
		content = content[:1024]
	}

	req := &OperateInfo{
		UserName:    userName,
		UserID:      userID,
		LogModule:   logModule,
		LogContent:  content,
		RequestURL:  ctx.Request().Path().GetURL().String(),
		RequestBody: body,
		UserIP:      userIP,
		Etentions:   args,
	}
	return req
}

func createLog(ctx hydra.IContext, req *OperateInfo) error {
	if err := req.Valid(); err != nil {
		return err
	}
	return dbCreate(req)
}
